package MCQReaderAnsweredAnalyze;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;

public class AnalyzeSelectedZone {

	private Graphics g;

	public AnalyzeSelectedZone(Graphics g) {
		super();
		this.setG(g);
	}

	private Coordonnees coordonnees(Rectangle rect) {
		return new Coordonnees(rect.x, rect.x + rect.width, rect.y, rect.y
				+ rect.height);
	}

	public boolean analyze(Rectangle rect, Image img, Color c) {
		getG().setColor(c);
		getG().fill3DRect(rect.x, rect.y, rect.width, rect.height, true);
		Coordonnees co = coordonnees(rect);
		return zoneAnalyse(co.getX1(), co.getX2(), co.getY1(), co.getY2(), img);
	}

	/**
	 * a method that analyses a zone in a bitmap image to see if it's colored
	 * totally in black or not
	 * 
	 * @param x1
	 *            first limit of the zone X-coordinate value(x>x1)
	 * @param x2
	 *            second limit of the zone X-coordinate value(x<x2)
	 * @param y1
	 *            first limit of the zone Y-coordinate value(y>y1)
	 * @param y2
	 *            second limit of the zone Y-coordinate value(y<y2)
	 * @param img
	 *            image containing the zone that is wanted to be analysed
	 */
	private boolean canBeConsideredBlack(int blue, int green, int red) {
		if (blue + green + red < 3 * 255 / 2)
			return true;
		return false;
	}

	private boolean zoneAnalyse(int x1, int x2, int y1, int y2, Image image) {

		BufferedImage img = (BufferedImage) image;

		// gérer les pixels de l'image img
		Raster pixels = img.getRaster(); // pixels représente un rectangle de
		// pixel

		// un compteur pour compter le nombre de pixels noirs reconnus dans
		// l'image
		double cpt = 0;

		// on analyse les pixels qui se situent
		// dans la zone définie entre x1<x<x2 et y1<y<y2
		for (int x = x1; x < x2; x++) {
			for (int y = y1; y < y2; y++) {

				// r=0 si le pixel situé au coordonnée(x,y) est rouge
				int r;
				try {
					r = pixels.getSample(x, y, 0);

					// g=0 si le pixel situé au coordonnée(x,y) est vert
					int g = pixels.getSample(x, y, 1);

					// b=0 si le pixel situé au coordonnée(x,y) est bleu
					int b = pixels.getSample(x, y, 2);

					// si r=g=b=0 la couleur est noir
					if (canBeConsideredBlack(b, g, r))
						cpt++;// on incrémente le nombre de pixel noir
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		// Surface sur laquelle on souhaite detecter le pourcentage de noir
		double pa = (x2 - x1) * (y2 - y1);

		// pourcentage de pixel noir détectés dans cette zone
		double blackPercent = cpt *100 / pa ;

		// on considere que la zone est suffisement remplie
		if (blackPercent >= 35)
			return true;
		else
			return false;

	}

	/**
	 * @param g
	 *            the g to set
	 */
	public void setG(Graphics g) {
		this.g = g;
	}

	/**
	 * @return the g
	 */
	public Graphics getG() {
		return g;
	}

}
